﻿using DevExpress.XtraEditors;
using MesProjectWinform.BasicData.Entity;
using MesProjectWinform.Public.Common;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace MesProjectWinform.BasicData.基础实现.gongyings
{
    public partial class yingup : DevExpress.XtraEditors.XtraForm
    {
        private long supplierId = 0;
        private SupplierModel currentSupplier = null;
        private bool isEdit = false; // 标记是否为编辑模式
        // 序号存储文件路径
        private readonly string sequenceFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "SupplierSequence.txt");
        // 日期格式化字符串
        private readonly string dateFormat = "yyMMdd";

        public yingup()
        {
            InitializeComponent();
            this.Load += Yingup_Load;
            
            // 设置编号文本框为只读
            textEdit1.Properties.ReadOnly = true;
            // 生成自动递增编码（仅在新增模式下）
            GenerateAutoIncrementCode();
        }

        /// <summary>
        /// 带ID参数的构造函数，用于修改操作
        /// </summary>
        /// <param name="id">供应商ID</param>
        public yingup(long id)
        {
            InitializeComponent();
            supplierId = id;
            isEdit = true;
            this.Text = "修改供应商";
            this.Load += Yingup_Load;
            
            // 设置编号文本框为只读
            textEdit1.Properties.ReadOnly = true;
            
            // 加载供应商数据
            LoadSupplierData();
        }

        /// <summary>
        /// 生成自动递增的供应商编码
        /// </summary>
        private void GenerateAutoIncrementCode()
        {
            // 只有在新增模式下才生成自动编码
            if (isEdit)
                return;
                
            try
            {
                // 生成当前日期部分 格式：yyMMdd
                string today = DateTime.Now.ToString(dateFormat);
                
                // 读取序号文件，获取当前最大序号
                int currentSequence = 1; // 默认从1开始
                string lastDate = string.Empty;
                
                if (File.Exists(sequenceFilePath))
                {
                    string[] fileContent = File.ReadAllLines(sequenceFilePath);
                    if (fileContent.Length >= 2)
                    {
                        lastDate = fileContent[0]; // 第一行存储日期
                        int.TryParse(fileContent[1], out currentSequence); // 第二行存储序号
                        
                        // 如果是新的一天，重置序号为1
                        if (lastDate != today)
                        {
                            currentSequence = 1;
                        }
                        // 注意：此处不自增序号，只显示当前序号
                    }
                }
                
                // 格式化为4位数字，前面补0
                string serialPart = currentSequence.ToString().PadLeft(4, '0');
                
                // 组合最终的编码：GYS + 日期 + 4位序号
                string finalCode = "GYS" + today + serialPart;
                
                // 设置到文本框
                textEdit1.Text = finalCode;
                Console.WriteLine($"生成供应商编码: {finalCode}, 序号: {currentSequence}");
            }
            catch (Exception ex)
            {
                XtraMessageBox.Show($"生成供应商编码时发生错误：{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                // 生成失败时使用默认编码
                textEdit1.Text = "GYS" + DateTime.Now.ToString(dateFormat) + "0001";
            }
        }

        /// <summary>
        /// 窗体加载事件，用于调试
        /// </summary>
        private void Yingup_Load(object sender, EventArgs e)
        {
            // 输出所有控件名称，以便确认控件命名
            Console.WriteLine("窗体加载，当前控件列表：");
            ListAllControls(this.Controls);
        }

        /// <summary>
        /// 递归列出所有控件
        /// </summary>
        private void ListAllControls(Control.ControlCollection controls, string indent = "")
        {
            foreach (Control control in controls)
            {
                Console.WriteLine($"{indent}控件: {control.Name}, 类型: {control.GetType().Name}");
                if (control.Controls.Count > 0)
                {
                    ListAllControls(control.Controls, indent + "  ");
                }
            }
        }

        /// <summary>
        /// 根据ID加载供应商数据
        /// </summary>
        private async void LoadSupplierData()
        {
            try
            {
                // 构建查询URL
                string url = $"api/Supplier/GetSupplierById?id={supplierId}";
                Console.WriteLine($"请求URL: {url}");
                
                // 临时保存原始BaseUrl
                string originalBaseUrl = Properties.Settings.Default.BaseUrl;
                try
                {
                    // 临时修改BaseUrl为端口5052
                    Properties.Settings.Default.BaseUrl = "http://localhost:5052/";
                
                    // 发送请求
                    string result = await HttpClientHelper.RequestUrl(RequestType.Get, url, string.Empty);
                    if (string.IsNullOrEmpty(result))
                    {
                        XtraMessageBox.Show("获取供应商数据失败", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        return;
                    }

                    Console.WriteLine($"API返回结果: {result}");

                    // 解析数据
                    JObject jsonObj = JObject.Parse(result);
                    if (jsonObj["Code"]?.ToString() != "200")
                    {
                        XtraMessageBox.Show(jsonObj["Message"]?.ToString() ?? "请求失败", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        return;
                    }

                    // 获取供应商数据
                    JObject supplierData = jsonObj["Data"] as JObject;
                    if (supplierData != null)
                    {
                        Console.WriteLine($"供应商原始数据: {supplierData}");
                        currentSupplier = supplierData.ToObject<SupplierModel>();
                        Console.WriteLine($"转换后的供应商对象: ID={currentSupplier.Id}, 名称={currentSupplier.Suppliername}");
                        
                        // 将数据显示到表单控件中
                        FillFormData(currentSupplier);
                    }
                    else
                    {
                        XtraMessageBox.Show("未找到供应商数据", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                        this.Close();
                    }
                }
                finally
                {
                    // 恢复原始BaseUrl
                    Properties.Settings.Default.BaseUrl = originalBaseUrl;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"异常: {ex.Message}\n{ex.StackTrace}");
                XtraMessageBox.Show($"加载供应商数据异常: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// 将供应商数据填充到表单控件
        /// </summary>
        /// <param name="supplier">供应商对象</param>
        private void FillFormData(SupplierModel supplier)
        {
            if (supplier == null) return;

            try
            {
                // 根据新截图显示的控件布局，更新映射关系
                // 注意：我们现在直接使用控件而不是通过查找，因为它们已经在Designer.cs中定义
                
                // 编号 - textEdit1
                if (textEdit1 != null)
                {
                    textEdit1.Text = supplier.Suppliercode ?? string.Empty;
                    Console.WriteLine($"设置编号: {supplier.Suppliercode}");
                }
                
                // 名称 - textEdit2
                if (textEdit2 != null)
                {
                    textEdit2.Text = supplier.Suppliername ?? string.Empty;
                    Console.WriteLine($"设置名称: {supplier.Suppliername}");
                }
                
                // 简称 - textEdit4 (根据新截图，简称是textEdit4)
                if (textEdit4 != null)
                {
                    textEdit4.Text = supplier.Supplierabbreviation ?? string.Empty;
                    Console.WriteLine($"设置简称: {supplier.Supplierabbreviation}");
                }
                
                // 联系方式 - textEdit3 (根据新截图，联系方式是textEdit3)
                if (textEdit3 != null)
                {
                    textEdit3.Text = supplier.Suppliercontactinformation ?? string.Empty;
                    Console.WriteLine($"设置联系方式: {supplier.Suppliercontactinformation}");
                }
                
                // 社会信用代码 - textEdit5 (根据新截图，信用代码是textEdit5)
                if (textEdit5 != null)
                {
                    textEdit5.Text = supplier.Suppliercreditcode ?? string.Empty;
                    Console.WriteLine($"设置信用代码: {supplier.Suppliercreditcode}");
                }
                
                // 地址 - memoEdit1 (根据新截图，地址是memoEdit1)
                if (memoEdit1 != null)
                {
                    memoEdit1.Text = supplier.Supplieraddress ?? string.Empty;
                    Console.WriteLine($"设置地址: {supplier.Supplieraddress}");
                }
                
                // 备注 - memoEdit2 (根据新截图，备注是memoEdit2)
                if (memoEdit2 != null)
                {
                    memoEdit2.Text = supplier.Supplierremarks ?? string.Empty;
                    Console.WriteLine($"设置备注: {supplier.Supplierremarks}");
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"设置控件值时出现异常: {ex.Message}\n{ex.StackTrace}");
                XtraMessageBox.Show($"数据显示异常: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
        
        /// <summary>
        /// 保存成功后更新序号
        /// </summary>
        private void UpdateSequenceAfterSuccess()
        {
            // 只有在新增模式下成功保存后才更新序号
            if (isEdit)
                return;
                
            try
            {
                // 获取当前日期
                string today = DateTime.Now.ToString(dateFormat);
                int currentSequence = 1;
                
                // 读取当前序号
                if (File.Exists(sequenceFilePath))
                {
                    string[] fileContent = File.ReadAllLines(sequenceFilePath);
                    if (fileContent.Length >= 2)
                    {
                        string lastDate = fileContent[0];
                        int.TryParse(fileContent[1], out currentSequence);
                        
                        // 如果是新的一天，重置序号为1
                        if (lastDate != today)
                        {
                            currentSequence = 1;
                        }
                        else
                        {
                            // 否则序号加1
                            currentSequence++;
                        }
                    }
                }
                
                // 保存更新后的序号到文件
                using (StreamWriter writer = new StreamWriter(sequenceFilePath, false))
                {
                    writer.WriteLine(today);
                    writer.WriteLine(currentSequence.ToString());
                }
                
                Console.WriteLine($"保存成功后更新序号: 日期={today}, 新序号={currentSequence}");
            }
            catch (Exception ex)
            {
                // 更新序号失败不影响主流程，可以静默处理
                Console.WriteLine($"更新序号失败：{ex.Message}");
            }
        }

        /// <summary>
        /// 重置
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void button1_Click(object sender, EventArgs e)
        {
            // 只有在新增模式下才需要重新生成编码
            if (!isEdit)
            {
                GenerateAutoIncrementCode();
            }
            else if (currentSupplier != null)
            {
                // 编辑模式下，重置回原始数据
                FillFormData(currentSupplier);
                return;
            }
            
            // 清空其他输入框
            textEdit2.Text = string.Empty; // 供应商名称
            textEdit3.Text = string.Empty; // 联系方式
            textEdit4.Text = string.Empty; // 简称
            textEdit5.Text = string.Empty; // 信用代码
            memoEdit1.Text = string.Empty; // 地址
            memoEdit2.Text = string.Empty; // 备注
        }

        /// <summary>
        /// 保存
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private async void button2_Click(object sender, EventArgs e)
        {
            // 验证输入
            if (string.IsNullOrWhiteSpace(textEdit1.Text))
            {
                XtraMessageBox.Show("供应商编码不能为空！", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            if (string.IsNullOrWhiteSpace(textEdit2.Text))
            {
                XtraMessageBox.Show("供应商名称不能为空！", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                return;
            }

            try
            {
                // 准备数据
                SupplierModel model = new SupplierModel
                {
                    Id = isEdit ? supplierId : 0,
                    Suppliercode = textEdit1.Text.Trim(),
                    Suppliername = textEdit2.Text.Trim(),
                    Supplierabbreviation = textEdit4.Text.Trim(),
                    Suppliercontactinformation = textEdit3.Text.Trim(),
                    Suppliercreditcode = textEdit5.Text.Trim(),
                    Supplieraddress = memoEdit1.Text.Trim(),
                    Supplierremarks = memoEdit2.Text.Trim(),
                    IsDeleted = false
                };

                // 如果是编辑模式
                if (isEdit && supplierId > 0)
                {
                    Console.WriteLine($"修改模式: ID={model.Id}");
                    
                    // 如果有原始供应商数据，保留原有的创建人和创建时间
                    if (currentSupplier != null)
                    {
                        model.CreatedBy = currentSupplier.CreatedBy;
                        model.CreatedTime = currentSupplier.CreatedTime;
                    }
                    else
                    {
                        // 如果没有原始数据，设置默认创建信息
                        model.CreatedBy = "admin";
                        model.CreatedTime = DateTime.Now;
                    }
                    
                    // 设置修改人为当前用户，修改时间为当前时间
                    model.UpdatedBy = "admin";
                    model.UpdatedTime = DateTime.Now;
                }
                // 如果是新增模式
                else
                {
                    Console.WriteLine("新增模式");
                    // 设置创建信息
                    model.CreatedBy = "admin";
                    model.CreatedTime = DateTime.Now;
                    model.UpdatedBy = "admin"; // 新增时，修改人也是创建人
                    model.UpdatedTime = DateTime.Now;
                }

                // 转换为JSON
                string jsonData = JsonConvert.SerializeObject(model);
                Console.WriteLine($"请求数据: {jsonData}");
                
                // 确定API路径 - 修正路径，根据是编辑还是新增使用不同的API
                string url = isEdit ? "api/Supplier/AddSupplier" : "api/Supplier/AddSupplier";
                Console.WriteLine($"请求API: {url}");

                // 临时保存原始BaseUrl
                string originalBaseUrl = Properties.Settings.Default.BaseUrl;
                try
                {
                    // 临时修改BaseUrl为端口5052
                    Properties.Settings.Default.BaseUrl = "http://localhost:5052/";
                    
                    // 发送请求
                    string result = await HttpClientHelper.RequestUrl(RequestType.Post, url, jsonData);
                    Console.WriteLine($"API返回结果: {result}");
                    
                    if (!string.IsNullOrEmpty(result))
                    {
                        bool isSuccess = false;
                        string errorMessage = "未知错误";

                        try
                        {
                            // 尝试解析返回结果
                            JObject jsonObj = JObject.Parse(result);
                            if (jsonObj["Code"]?.ToString() == "200")
                            {
                                isSuccess = true;
                            }
                            else
                            {
                                errorMessage = jsonObj["Message"]?.ToString() ?? "操作失败";
                            }
                        }
                        catch (Exception parseEx)
                        {
                            Console.WriteLine($"解析JSON结果异常: {parseEx.Message}");
                            // 如果解析JSON失败，尝试直接判断是否包含成功信息
                            isSuccess = result.Contains("\"Code\":200") || result.Contains("\"code\":200") ||
                                       result.Contains("success") || result.Contains("Success");
                        }

                        if (isSuccess)
                        {
                            // 保存成功后更新序号（仅在新增模式下）
                            if (!isEdit)
                            {
                                UpdateSequenceAfterSuccess();
                            }
                            
                            XtraMessageBox.Show(isEdit ? "修改成功！" : "添加成功！", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
                            
                            // 关闭窗体并返回OK结果，让调用者知道需要刷新数据
                            DialogResult = DialogResult.OK;
                            this.Close();
                        }
                        else
                        {
                            XtraMessageBox.Show($"操作失败：{errorMessage}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                        }
                    }
                    else
                    {
                        XtraMessageBox.Show("API返回结果为空，请检查网络连接或API服务是否正常", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    }
                }
                finally
                {
                    // 恢复原始BaseUrl
                    Properties.Settings.Default.BaseUrl = originalBaseUrl;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine($"保存操作发生异常: {ex.Message}\n{ex.StackTrace}");
                XtraMessageBox.Show($"操作失败：{ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }
    }
}